Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

55장. 블록 · 파일 · 객체 스토리지의 차이

이 장에서 말하고자 하는 것

ECS 위에 컨테이너를 띄우고 ALB로 받는 흐름까지 만들었다.

다음 질문이 자연스럽게 따라온다.

“데이터를 어디에 저장할까?”

AWS의 저장소는 크게 세 종류로 나뉜다.

  • 블록 스토리지
  • 파일 스토리지
  • 객체 스토리지

이 셋의 차이를 모르고 들어가면 잘못된 자리에 데이터를 둔다.


1. 블록 스토리지 — 디스크처럼

물리 디스크처럼 동작하는 저장소

  • 한 번에 한 인스턴스가 마운트
  • OS가 파일 시스템(ext4 등) 을 만든다
  • 빠르다 — DB에 적합
  • 같은 AZ 안에서만 마운트 가능

AWS에서는 EBS 다.


2. 파일 스토리지 — 공유 폴더처럼

여러 서버가 동시에 마운트하는 공유 폴더

  • NFS · SMB 프로토콜
  • 여러 인스턴스 동시 읽기/쓰기
  • AZ 사이에서도 접근 가능
  • 블록보다 느리다

AWS에서는 EFS · FSx 다.


3. 객체 스토리지 — HTTP로 접근

파일을 HTTP API로 저장 · 조회하는 저장소

  • 마운트하지 않는다
  • 폴더 구조가 가짜다 (Prefix)
  • 사실상 무제한 용량
  • 매우 저렴
  • 동시에 N 사람이 GET 가능

AWS에서는 S3 다.


4. 한 표로

항목블록 (EBS)파일 (EFS)객체 (S3)
접근한 인스턴스 마운트여러 인스턴스 마운트HTTP API
적합DB · OS 디스크공유 파일 · 미디어정적 자원 · 백업 · 로그
용량정해진 크기거의 무제한거의 무제한
속도매우 빠름중간객체 단위 응답
비용보통비쌈매우 저렴
AZ같은 AZ만멀티 AZ리전

5. 어떻게 고르는가

DB · 인덱스 · 부팅 디스크 → EBS
여러 서버가 공유하는 파일 → EFS
사용자 업로드 · 이미지 · 로그 · 백업 → S3

의심스러우면 S3 부터 본다


6. 컨테이너 시대의 변화

EC2 시대에는 디스크가 자연스러웠다.

컨테이너 시대에는

  • 컨테이너는 일회용 → EBS 의존도 줄어듦
  • 데이터는 외부 저장소로 → S3 · RDS · DynamoDB 가 표준
  • 공유 파일이 필요하면 EFS

컨테이너 안에 영구 데이터를 두지 않는다


7. 우리 서비스에서

[ECS 컨테이너]
   ├─ 사용자 업로드 → S3
   ├─ 정적 자원   → S3 (CloudFront로 캐시)
   ├─ 로그        → CloudWatch / S3
   ├─ DB          → RDS / DynamoDB
   └─ 공유 파일   → EFS (필요할 때만)

이 책의 척추는 S3 + RDS + DynamoDB 가 중심이다.


8. 직접 확인해보기 — CLI

# 블록 (EBS)
aws ec2 describe-volumes

# 파일 (EFS)
aws efs describe-file-systems

# 객체 (S3)
aws s3 ls
aws s3 cp ./file.txt s3://my-bucket/file.txt

각자의 인터페이스가 다른 게 그대로 느껴진다.


9. 코드로는 이렇게 생겼다 — Terraform

# 블록
resource "aws_ebs_volume" "data" {
  availability_zone = "ap-northeast-2a"
  size              = 100
  type              = "gp3"
}

# 파일
resource "aws_efs_file_system" "shared" {
  performance_mode = "generalPurpose"
}

# 객체
resource "aws_s3_bucket" "uploads" {
  bucket = "msa-uploads"
}

세 종류가 얼마나 다른 자리에 사는지 코드에서도 보인다.


10. 이렇게 쓰면 망한다 — 안티패턴

안티패턴 1. 사용자 업로드를 EBS에 저장한다

EBS는 한 인스턴스에만 붙는다. 스케일링하면 다른 인스턴스에서 그 파일을 못 본다.

업로드는 S3

안티패턴 2. 로그를 컨테이너 안에 쌓는다

컨테이너 죽으면 사라진다.

로그는 CloudWatch / S3

안티패턴 3. EFS를 데이터베이스에 쓴다

NFS는 DB가 요구하는 fsync 동작과 충돌이 난다.

안티패턴 4. S3에 폴더가 있다고 믿는다

a/b/c.txt 는 사실 한 객체 키다. “폴더 이동” 같은 연산이 없다.


11. 한 줄로 정리

블록은 디스크, 파일은 공유 폴더, 객체는 HTTP — 자리가 다른 세 종류다


12. 이 장의 핵심 정리

  1. 블록(EBS) · 파일(EFS) · 객체(S3) 는 접근 방식 자체가 다르다.
  2. DB와 OS는 블록, 공유 파일은 파일, 나머지는 거의 다 객체다.
  3. 컨테이너 시대에는 영구 데이터를 외부 저장소로 옮긴다.
  4. 의심스러우면 S3가 보통 답이다.
  5. EFS는 DB나 대량 트랜잭션에는 어울리지 않는다.